可复用的函数和模块

函数的定义

def hi():
    print('heelo world')
hi()

参数

自定义参数

def Cube(x=5):
    return x**3
Cube(2)  #计算2的三次方
Cube()   #计算默认值的三次方

传参方式

def fun(x,y,z):
    return x+y-z
fun(1,2,3)  #按顺序传递参数
fun(x=1,y=2,z=3)   #按参数名传递参数

按顺序传递的参数要位于按参数名传递的参数之前

fun(1,z=3,y=2)

传递任意数量的参数

在定义函数时,如果在参数名前加上一个星号“*”,则表示该参数是一个可变长参数。

def my_min(*list):

参数返回计算结果

参数中使用可变对象(列表等),使函数中的结果返回到参数中。

def change(x):
    x[0]=x[0]**2
b = [2]
change(b)
>>>[4]

变量的作用域

lambda表达式定义函数

使用lambda表达式可以定义一个匿名函数(所定义的函数没有函数名)
一般形式:

lambda 参数列表:表达式

例:

fun = lambda x: x * x - x    #使用lambda表达式定义一个函数,返回函数地址(给fun)
fun(3)                        #调用lambda表达式定义的函数
6                            #函数返回值

lambda表达式适用于定义小型函数,在函数中仅能包含单一的参数表达式,而不能包含其他语句。

def show():                #使用def定义show()函数
    print('lambda')
f = lambda:show()        #在lambda表达式中调用show()函数
f()                        #调用使用lambda表达式生成的函数
>>>lambda

模块

导入

import 模块名
import 模块名 as 新名字
from 模块名 import 函数名

编译模块

运行完.py文件之后会发现在目录中会多一个pycache文件夹,下面会有一个mymodule.cpython-36.pyc文件,这个文件就是Python将mymodule.py文件编译成字节码的文件。

由于Python是脚本语言,如果不想发布源文件,可以发布编译后的脚本。

将1.py编译为.pyc文件

#file:compile.py
#
import py_compile                        #导入py_compile模块
py_compile.compile('1.py','1.pyc');        #编译1.py

可以看到编译后的1.py文件并没有改变程序功能,只是以Python字节码的形式存在。

在命令行中优化脚本

python -O 1.py        #对脚本的优化不多,编译后的脚本以.pyo为扩展名。
python -OO 1.py        #优化程度大,脚本更小,但是可能会导致脚本错误,谨慎使用!

查看模块函数名

import sys
dir(sys)

包(解决查找路径的问题)

包可以看作处于同一目录中的模块,在包的每个目录中都必须包含一个名为init.py的文件。可以是空文件,仅用来表示该目录是一个包。

init.py文件主要用途是设置all变量,以及所包含的包初始化所需的代码。

在from中使用通配符“*”导入包内所有的名字时,在init.py文件中设置all变量可以保证名字正确输导入。

from A.B import a    #是哟弄个form导入模块
import A.B.a        #使用import导入模块

只要将所有的模块放在当前目录中的某个文件夹内,然后在该文件夹中新建一个空的init.py文件,就可以通过目录结构的层次导入所需的模块,不用将目录的路径添加到sys.path路径列表中。

内部引用

A:    __init__.py
    B:    __init__.py
        a.py
    C:    __init__.py
        a.py
        b.py

对于C目录中的b.py
引用同样位于C目录中的a.py

import a

C目录中的b.py要引用B目录中的a.py

from A.B import a